/*
 * FifoProtocoloPlano.cpp
 *
 *  Created on: Sep 19, 2013
 *      Author: gonprieto
 */

#include "FifoProtocoloPlano.h"
#include "Logger.h"

#define MAX_MESSAGE_SIZE sizeof(unsigned long int)


FifoProtocoloPlano::FifoProtocoloPlano(std::string fifoName,bool esLectura ) : Fifo(fifoName,esLectura) {
	//deprecated!!
	this->useLock = false;
}

FifoProtocoloPlano::~FifoProtocoloPlano() {}

void FifoProtocoloPlano::openForRead(){
	Fifo::openForRead();
}

void FifoProtocoloPlano::openForWrite(){
	Fifo::openForWrite();
}

void FifoProtocoloPlano::escribirDTO(DTO& dto){
	LockFile* lf =NULL;
	if(useLock){
		lf = new LockFile(this->nombre.c_str(),ESCRITURA);
	}

	std::string stream = pp.serializar(dto);
	std::string toWrite = UtilString::TOlenghtStringStringValue(stream);
	

	if(lf != NULL){
		//Logger::instancia() << "FifoProtocoloPlano::escribirDTO - Tomo Lock :Para" << this->nombre << eol;
		if ( lf->tomarLock() == -1 ){
			Logger::instancia() << "FifoProtocoloPlano::escribirDTO - FALLO al Tomo Lock -File:" << this->nombre << eol;
		}
		//Logger::instancia() << "FifoProtocoloPlano::escribirDTO - Tomo Lock - Sucess" << eol;
	}

	//Escribo el mensaje
	this->escribir(toWrite.c_str(),toWrite.size());

	if(lf != NULL){
		//Logger::instancia() << "FifoProtocoloPlano::escribirDTO - Libero Lock de:" << this->nombre << eol;
		lf->liberarLock();
		delete lf;
	}
}

DTO* FifoProtocoloPlano::leerDTO(){
	LockFile* lf =NULL;

	char tamanio[MAX_MESSAGE_SIZE];
	memset(&tamanio,0,MAX_MESSAGE_SIZE);
	tamanio[0]='\0';

	if(useLock){
		lf = new LockFile(this->nombre.c_str(),LECTURA);
	}

	if(lf != NULL){
		//Logger::instancia() << "FifoProtocoloPlano::leerDTO - Tomo Lock Para" << this->nombre << eol;
		if ( lf->tomarLock() == -1 ){
			Logger::instancia() << "FifoProtocoloPlano::escribirDTO - FALLO al Tomo Lock -File:" << this->nombre << eol;
		}
		//Logger::instancia() << "FifoProtocoloPlano::leerDTO - Tomo Lock - Sucess" << eol;
	}

	//Obtengo el mensaje a leer
	char* mensaje = new char[PLANO_MAX_LONG + 1];
	int resultado = this->leer(mensaje, PLANO_MAX_LONG);

	if(lf != NULL){
		//Logger::instancia() << "FifoProtocoloPlano::leerDTO - Libero Lock De:" << this->nombre<< eol;
		lf->liberarLock();
		delete lf;
	}

	if ( resultado == FIFO_ERROR){
		Logger::instancia() << "FifoProtocoloPlano::leerDTO - ERROR no pude leer, en fifo:" << this->nombre<< eol;
		exit(1);
	}

	std::string serializedDTO(mensaje);

	//Delete del new anterior
	delete mensaje;

	return resultado == 0 ? NULL: pp.deserializar(serializedDTO);
}



